package com.example.his.api.front.impl;

import cn.felord.payment.wechat.v3.WechatApiProvider;
import cn.felord.payment.wechat.v3.WechatResponseEntity;
import cn.felord.payment.wechat.v3.model.Amount;
import cn.felord.payment.wechat.v3.model.PayParams;
import cn.felord.payment.wechat.v3.model.SceneInfo;
import com.example.his.api.front.service.PaymentService;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.OffsetDateTime;

@Service
@Slf4j
public class PaymentServiceImpl implements PaymentService {

  @Resource
  private WechatApiProvider wechatApiProvider;

  /**
   * 微信统一下单接口
   *
   * @param outTradeNo 商户订单号
   * @param total      订单总金额，单位为分
   * @param desc       商品描述
   * @param notifyUrl  微信支付异步通知回调地址
   * @param timeExpire 订单失效时间，格式为 ISO 8601 标准的时间字符串，例如 "2025-01-01T12:00:00+08:00"
   * @return 微信返回的预支付交易会话标识等信息组成的 ObjectNode 对象
   */
  @Override
  public ObjectNode unifiedOrder(String outTradeNo, int total, String desc, String notifyUrl, String timeExpire) {

    // 构造支付参数对象
    PayParams payParams = new PayParams();
    Amount amount = new Amount();

    // 设置订单总金额（单位为分）
    amount.setTotal(total);
    payParams.setAmount(amount);

    // 设置商品描述
    payParams.setDescription(desc);

    // 设置商户订单号
    payParams.setOutTradeNo(outTradeNo);

    // 设置微信支付异步通知回调地址
    payParams.setNotifyUrl(notifyUrl);

    // 设置场景信息，这里设置支付终端的IP地址
    SceneInfo sceneInfo = new SceneInfo();
    sceneInfo.setPayerClientIp("127.0.0.1");
    payParams.setSceneInfo(sceneInfo);

    // 如果传入了订单失效时间，则进行设置
    if (timeExpire != null) {
      payParams.setTimeExpire(OffsetDateTime.parse(timeExpire));
    }

    // 调用微信 native 支付接口发起支付请求
    WechatResponseEntity<ObjectNode> response = wechatApiProvider.directPayApi("his-vue").nativePay(payParams);

    // 判断请求是否成功
    if (response.is2xxSuccessful()) {
      // 成功则返回响应体中的 JSON 数据
      ObjectNode json = response.getBody();
      return json;
    } else {
      // 失败则记录错误日志并抛出运行时异常
      log.error("微信下单失败:{}", response.getBody());
      throw new RuntimeException("微信下单失败");
    }
  }
}
